/*
 * tp boole
 */
package boole.circuit;

import boole.port.PortEntreeSortie;
import boole.port._PortEntree;
import boole.port._PortEntreeSortie;
import boole.port._PortSortie;
import boole.port.exception.PortAlreadyConnectedException;
import java.util.HashMap;
import java.util.Map;

/**
 *
 * @author Rémi PIOTAIX <remi.piotaix@gmail.com>
 * @author thomas
 */
public abstract class CircuitOuvert extends Circuit implements _PortOwner {

    private Map<Integer, _PortEntreeSortie> portEntrees;
    private Map<Integer, _PortEntreeSortie> portSorties;

    public CircuitOuvert(int nombreEntrees, int nombreSorties) {
        super(new HashMap());
        portEntrees = new HashMap();
        portSorties = new HashMap();

        //initialisation des ports
        for (int i = 1; i <= nombreEntrees; i++) {
            portEntrees.put(i, new PortEntreeSortie(this));
        }

        for (int i = 1; i <= nombreSorties; i++) {
            portSorties.put(i, new PortEntreeSortie(this));
        }
    }

    @Override
    public _PortEntreeSortie getEntree(int identifiant) {
        return portEntrees.get(identifiant);
    }

    @Override
    public int getNombreEntrees() {
        return portEntrees.size();
    }

    @Override
    public int getNombreSorties() {
        return portSorties.size();
    }

    @Override
    public _PortEntreeSortie getSortie(int identifiant) {
        return portSorties.get(identifiant);
    }

    @Override
    public void connectSortieTo(int num, _PortOwner cible, int numPortCible) {
        try {
            _PortSortie sortie = this.getSortie(num);
            _PortEntree entreeCible = cible.getEntree(numPortCible);
            sortie.connect(entreeCible);
            entreeCible.connect(sortie);
        } catch (PortAlreadyConnectedException pace) {
            System.out.println("Le port numero " + num + " est deja connecte");
            throw pace;
        }
    }

    public boolean isValid() {
        for(_Composant c: this.getOperateurs().values()){
            if(!c.isValid())
                return false;
        }
        for (_PortSortie ps : this.portSorties.values()) {
            if (!ps.isValid()) {
                return false;
            }
        }
        for (_PortEntree pe : this.portEntrees.values()) {
            if (!pe.isValid()) {
                return false;
            }
        }
        return true;
    }
}
